"""author: wenyao
   data: 2021/5/18
   project: devopscmdb
"""
#生命周期
# def outer():
#     a = 10
#     print(f"test {a}")
#
# outer()
# print(a)

#LEGB原则

# def outer(x):
#     a = 300
#     def inner():
#         print(x+a)
#     return inner
#
# d = outer(10)
# d()

#闭包满足的条件
#1、必须有一个内嵌函数
#2、内函数必须引用外函数变量
#3、外函数必须返回内函数
#
# def outer():
#     tmp_list = []
#     def inner(name):
#         tmp_list.append(1)
#         print("%s -- %s"%(name, tmp_list))
#     return inner
#
# d1 = outer()
# d1("d1")
# d1("d1")
# d2 = outer()
# d2("d2")
# d2("d2")
# print(id(d1),id(d2))
#每次调用外函数，都会重新执行，创建一个新的tmp_list和inner
#代码虽然一样，但是创建了不同对象

def outer():
    fs = []
    for i in range(5):
        def inner():
            return i*i
        fs.append(inner)
    return fs
f1, f2, f3, f4, f5 = outer()  #执行完outer之后，i的值为4
#在此处才会去执行inner函数，才会去看i的值为多少
print(dir(f1), f1.__closure__)
print(f1())
print(f2())
print(f3())
print(f4())
print(f5())

#形成闭包之后，闭包函数会得到一个非空的__closure__属性
